import { mysqlTable, varchar, timestamp, int } from 'drizzle-orm/mysql-core'
import { createInsertSchema } from 'drizzle-zod'
import * as z from 'zod'
import {
  defaultPageZodConfig,
  idCardValidation,
  phoneValidation,
  stringValidation
} from '../config/zod'

// 用户表定义
export const usersTable = mysqlTable('user', {
  id: int().autoincrement().primaryKey(),
  phone: varchar({ length: 20 }).notNull().unique(), // 手机号
  password: varchar({ length: 255 }).notNull(), // 密码
  name: varchar({ length: 255 }).notNull(), // 姓名
  idCard: varchar({ length: 50 }), // 身份证号
  role: varchar({ length: 50 }).notNull(), // 角色
  remark: varchar({ length: 255 }), // 备注
  status: int().default(StatusEnum.可用).notNull(), // 状态
  lastLoginAt: timestamp('last_login_at', { mode: 'date' }), // 登录时间
  createdAt: timestamp('created_at', { mode: 'date' }).defaultNow().notNull(),
  updatedAt: timestamp('updated_at', { mode: 'date' }).defaultNow().onUpdateNow().notNull()
})

const baseInsertSchema = createInsertSchema(usersTable, {
  phone: phoneValidation,
  password: z.string().min(6, '密码至少6位'),
  name: stringValidation('姓名'),
  idCard: idCardValidation,
  role: stringValidation('角色'),
  remark: stringValidation('备注', 255),
  status: z.enum(StatusEnum).default(StatusEnum.可用)
})

// 创建用户 Schema (新建)
export const createUserSchema = baseInsertSchema.omit({
  id: true,
  lastLoginAt: true,
  createdAt: true,
  updatedAt: true
})

// 更新用户 Schema
export const updateUserSchema = baseInsertSchema
  .omit({
    id: true,
    password: true,
    lastLoginAt: true,
    createdAt: true,
    updatedAt: true
  })
  .partial() // 所有字段都是可选的

// 更新密码 Schema
export const updatePasswordSchema = z.object({
  id: z.number().int().positive('用户ID必须为正整数'),
  oldPassword: z.string().min(1, '原密码不能为空'),
  newPassword: z.string().min(6, '新密码至少6位'),
  confirmPassword: z.string().min(1, '请确认新密码')
})

// 用户列表查询 Schema
export const usersListQuerySchema = baseInsertSchema
  .pick({
    name: true,
    role: true
  })
  .extend(defaultPageZodConfig)

// 用户登录验证模式
export const usersLoginRequestSchema = baseInsertSchema.pick({
  phone: true,
  password: true
})
